home *** CD-ROM | disk | FTP | other *** search
/ The Atari Compendium / The Atari Compendium (Toad Computers) (1994).iso / files / prgtools / programm.ing / m2posx10.zoo / m2posix.10 / src / term.dpp < prev    next >
Encoding:
Modula Definition  |  1993-12-09  |  18.5 KB  |  443 lines

  1. DEFINITION MODULE term;
  2. __DEF_SWITCHES__
  3. #ifdef HM2
  4. #ifdef __LONG_WHOLE__
  5. (*$!i+: Modul muss mit $i- uebersetzt werden! *)
  6. (*$!w+: Modul muss mit $w- uebersetzt werden! *)
  7. #else
  8. (*$!i-: Modul muss mit $i+ uebersetzt werden! *)
  9. (*$!w-: Modul muss mit $w+ uebersetzt werden! *)
  10. #endif
  11. #endif
  12. (*****************************************************************************)
  13. (* Funktionen, die Terminalattribute kontrollieren.                          *)
  14. (*                                                                           *)
  15. (* Ein Fehler ist immer dann aufgetreten, wenn bei Funktionen mit Typ INTEGER*)
  16. (* ein negativer Wert zurueckgegeben wird.                                   *)
  17. (* Die genaue Fehlerursache kann bei Bedarf ueber "err.errno" und die ent-   *)
  18. (* sprechenden Konstanten ermittelt werden. Die Funktionen veraendern "errno"*)
  19. (* nur dann, wenn ein Fehler aufgetreten ist, bei erfolgreicher Ausfuehrung  *)
  20. (* wird "errno" nicht veraendert.                                            *)
  21. (*                                                                           *)
  22. (* GEMDOS:                                                                   *)
  23. (* Die Eigenschaften der Funktionen unter dem ``blanken'' GEMDOS sind z.T.   *)
  24. (* stark eingeschraenkt; unter dem Stichwort GEMDOS ist deswegen immer       *)
  25. (* angegeben, in wieweit die Funktion emuliert werden kann. Ist MiNT-Unter-  *)
  26. (* stuetzung angegeben, so ist unter der Betriebssystemerweiterung MiNT      *)
  27. (* eine bessere Unterstuetzung der Funktionen zu erwarten; wie weit diese    *)
  28. (* geht, ist unter dem Stichwort MiNT angegeben.                             *)
  29. (* --------------------------------------------------------------------------*)
  30. (* 04-Dez-93, Holger Kleinschmidt                                            *)
  31. (*****************************************************************************)
  32.  
  33. FROM PORTAB IMPORT
  34. (* TYPE *) UNSIGNEDWORD;
  35.  
  36. FROM types IMPORT
  37. (* TYPE *) pidT, StrPtr;
  38.  
  39. (*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
  40.  
  41. CONST
  42.   LCtermid = 128; (* minimale Stringgroesse fuer "ctermid()" *)
  43.  
  44.  
  45. TYPE (* Flags, die die Ein/Ausgabe beeinflussen *)
  46.   tciflags = (
  47.     IGNCR,
  48.       (* Ein empfangenes CR-Zeichen wird ignoriert (nicht in die Eingabe
  49.          uebernommen. *)
  50.     ICRNL,
  51.       (* Falls IGNCR nicht gesetzt ist, wird ein empfangenes CR-Zeichen
  52.          in ein NL-Zeichen verwandelt (wird zum Zeilenbegrenzer). *)
  53.     INLCR,
  54.       (* Ein empfangenes NL-Zeichen wird in ein CR-Zeichen verwandelt,
  55.          und ist damit kein Zeilenbegrenzer mehr, es sei denn, das EOF-
  56.          oder EOL-Zeichen ist gleich dem CR-Zeichen. *)
  57.     INPCK,
  58.       (* Es wird ein ``Parity-Check'' der Eingabe vorgenommen. *)
  59.     IGNPAR,
  60.       (* Bytes mit ``Parity''- oder ``Framing''-Fehlern werden ignoriert. *)
  61.     PARMRK,
  62.       (* Falls IGNPAR nicht gesetzt ist, wird ein Byte X mit ``Parity''-
  63.          oder ``Framing''-Fehler bei der Eingabe in die Drei-Byte-Sequenz
  64.          255, 0, X verwandelt. Falls beide Flags nicht gesetzt sind, wird
  65.          ein Fehler als Nullbyte gelesen. *)
  66.     ISTRIP,
  67.       (* Bytes werden Modulo 128 gelesen. Falls das Flag nicht gesetzt
  68.          ist, wird ein Byte mit dem Wert 255 in die Zwei-Byte-Sequenz
  69.          255, 255 verwandelt. *)
  70.     IGNBRK,
  71.       (* Eine ``Break''-Bedingung (eine bestimmte Zeitspanne nur Nullbits)
  72.          wird ignoriert. Falls 'IGNBRK' und 'BRKINT' geloescht sind, wird
  73.          eine ``Break''-Bedingung als Nullbyte gelesen ('PARMRK' geloescht)
  74.          oder als Drei-Byte-Sequenz 255, 0, 0 ('PARMRK' gesetzt). *)
  75.     BRKINT,
  76.       (* Falls 'IGNBRK' geloescht ist, werden gepufferte Ein- und
  77.          Ausgaben bei einer ``Break''-Bedingung geloescht, und falls
  78.          das Terminal das Kontrollterminal fuer einen Vordergrund-
  79.          Prozess ist, wird ein 'SIGINT'-Signal fuer die entsprechende
  80.          Prozessgruppe ausgeloest. *)
  81.     IXON,
  82.       (* STOP- und START-Zeichen werden nicht in die Eingabe uebernommen,
  83.          sondern stoppen die Terminalausgabe bzw. schalten sie wieder
  84.          ein. Falls das Flag geloescht ist, werden die Zeichen als
  85.          normale Eingaben uebernommen. *)
  86.     IXOFF,
  87.       (* Das System kann STOP- und START-Zeichen senden, damit der
  88.          Eingabepuffer nicht ueberlaeuft ('MAX_INPUT'), bzw. damit
  89.          wieder Zeichen gesendet werden sollen. *)
  90.     tciflag11, tciflag12, tciflag13, tciflag14, tciflag15
  91.   );
  92.  
  93. TYPE
  94.   tciflagT = PACKEDSET OF tciflags;
  95.  
  96.  
  97.  
  98.  
  99. TYPE (* Nicht standardisiert *)
  100.   tcoflags = (
  101.     OPOST, (* Implementierungsspezifische Zeichenwandlung bei der Ausgabe *)
  102.     tcoflag1,  tcoflag2,  tcoflag3,  tcoflag4,  tcoflag5,  tcoflag6,
  103.     tcoflag7,  tcoflag8,  tcoflag9,  tcoflag10, tcoflag11, tcoflag12,
  104.     tcoflag13, tcoflag14, tcoflag15
  105.   );
  106.  
  107. TYPE
  108.   tcoflagT = PACKEDSET OF tcoflags;
  109.  
  110.  
  111.  
  112.  
  113. TYPE (* Flags, die die Terminal-Hardware beeinflussen *)
  114.   tccflags = (
  115.     CLOCAL,
  116.       (* *)
  117.     CREAD,
  118.       (* Falls gesetzt, werden Zeichen empfangen, sonst nicht. *)
  119.     CSTOPB,
  120.       (* Falls gesetzt, werden nach jedem Zeichen zwei Stoppbits gesendet *)
  121.     csize0, (* siehe unten *)
  122.     csize1, (* siehe unten *)
  123.     PARENB,
  124.       (* ``Parity''-Pruefung und -Erkennung eingeschaltet *)
  125.     PARODD,
  126.       (* Es wird ``Odd Parity'' verwendet, sonst ``Even Parity''. *)
  127.     HUPCL,
  128.       (* Wenn das Terminal von keinem Prozess mehr geoeffnet ist, wird
  129.          automatisch die Verbindung unterbrochen. *)
  130.  
  131.     tccflag8,
  132.     tccflag9,
  133.     tccflag10,
  134.     tccflag11,
  135.     tccflag12,
  136.     tccflag13,
  137.     tccflag14,
  138.     tccflag15
  139.   );
  140.  
  141. TYPE
  142.   tccflagT = PACKEDSET OF tccflags;
  143.  
  144. CONST
  145.   (* Maske und Werte fuer 5,6,7 oder 8 Bit pro Byte *)
  146.   CSIZE = tccflagT{csize0,csize1};
  147.  
  148.   CS5 = tccflagT{};
  149.   CS6 = tccflagT{csize0};
  150.   CS7 = tccflagT{csize1};
  151.   CS8 = tccflagT{csize0,csize1};
  152.  
  153.  
  154.  
  155. TYPE (* Flags, die fuer Anwendungsprogramme von Interesse sind *)
  156.   tclflags = (
  157.     ICANON,
  158.       (* Terminal ist im ``kanonischen Modus'' (Eingabe wird zeilenweise
  159.          behandelt), sonst im ``Nicht kanonischen Modus'' (keine Zeilen-
  160.          struktur). *)
  161.     ECHO,
  162.       (* Echo bei der Eingabe *)
  163.     ECHOE,
  164.       (* Falls 'ICANON' gesetzt ist, loescht ein 'ERASE'-Zeichen das vorige
  165.          Zeichen vom Bildschirm. *)
  166.     ECHOK,
  167.       (* Falls 'ICANON' gesetzt ist, loescht ein 'KILL'-Zeichen entweder
  168.          die aktuelle Zeile vom Bildschirm oder ein 'NL'-Zeichen wird
  169.          zurueckgesendet. *)
  170.     ECHONL,
  171.       (* Falls 'ICANON' gesetzt ist, erfolgt fuer ein empfangenes 'NL'-Zeichen
  172.          ein Echo, auch wenn 'ECHO' nicht gesetzt ist. *)
  173.     ISIG,
  174.       (* Die Zeichen 'INTR', 'QUIT' und 'SUSP' werden nicht in die Eingabe
  175.          uebernommen, sondern loesen die entsprechende Ausnahme aus. *)
  176.     NOFLSH,
  177.       (* Beim Empfang eines 'INTR'-, 'QUIT'- oder 'SUSP'-Zeichens werden
  178.          gepufferte Ein- und Ausgaben geloescht. *)
  179.     IEXTEN,
  180.       (* Implementierungsspezifische Spezialzeichen und -funktionen werden
  181.          verfuegbar gemacht. *)
  182.     TOSTOP,
  183.       (* Falls ``Job control'' unterstuetzt wird, und ein Hintergrundprozess
  184.          auf sein Kontrollterminal zu schreiben versucht, wird ein 'SIGTTOU'-
  185.          Signal fuer dessen Prozessgruppe generiert. *)
  186.     tclflag9, tclflag10, tclflag11, tclflag12, tclflag13, tclflag14,
  187.     tclflag15
  188.   );
  189.  
  190. TYPE
  191.   tclflagT = PACKEDSET OF tclflags;
  192.  
  193.  
  194.  
  195. TYPE
  196.   speedT = (
  197.     B0,     (* Fuer Ausgabe: Verbindung aufgeben (``Hang up'')
  198.                Fuer Eingabe: Gleiche Baudrate wie Ausgabe      *)
  199.     B50,    (*    50 baud *)
  200.     B75,    (*    75 baud *)
  201.     B110,   (*   110 baud *)
  202.     B134,   (*   134 baud *)
  203.     B150,   (*   150 baud *)
  204.     B200,   (*   200 baud *)
  205.     B300,   (*   300 baud *)
  206.     B600,   (*   600 baud *)
  207.     B1200,  (*  1200 baud *)
  208.     B1800,  (*  1800 baud *)
  209.     B2400,  (*  2400 baud *)
  210.     B4800,  (*  4800 baud *)
  211.     B9600,  (*  9600 baud *)
  212.     B19200, (* 19200 baud *)
  213.     B38400  (* 38400 baud *)
  214.   );
  215.  
  216. TYPE
  217.   ccT = UNSIGNEDWORD; (* ``Multibyte Character'' fuer Spezialzeichen *)
  218.  
  219.   (* Indizes fuer die Spezialzeichen in 'TermiosRec.cCc' *)
  220.   ccIdx = (
  221.     VEOF,   (* 'EOF'-Zeichen *)
  222.     VEOL,   (* 'EOL'-Zeichen *)
  223.     VERASE, (* 'ERASE'-Zeichen *)
  224.     VKILL,  (* 'KILL'-Zeichen *)
  225.     VINTR,  (* 'INTR'-Zeichen *)
  226.     VQUIT,  (* 'QUIT'-Zeichen *)
  227.     VSUSP,  (* 'SUSP'-Zeichen *)
  228.     VSTOP,  (* 'STOP'-Zeichen *)
  229.     VSTART, (* 'START'-Zeichen *)
  230.     VMIN,   (* 'MIN'-Zeichen *)
  231.     VTIME   (* 'TIME'-Zeichen *)
  232.   );
  233.  
  234. CONST (* Anzahl der konfigurierbaren Spezialzeichen *)
  235.   NCCS = 11; (* ORD(MAX(ccIdx)) + 1 *)
  236.  
  237. CONST
  238.   (* Diese Spezialzeichen stehen fest *)
  239.   CR = 13;
  240.   NL = 10;
  241.  
  242.  
  243. TYPE
  244.   TermiosRec = RECORD
  245.     cIflag : tciflagT;
  246.     cOflag : tcoflagT;
  247.     cCflag : tccflagT;
  248.     cLflag : tclflagT;
  249. #if only_subrange_index
  250.     cCc    : ARRAY [VEOF..VTIME] OF ccT;
  251. #else
  252.     cCc    : ARRAY ccIdx OF ccT;
  253. #endif
  254.   END;
  255.  
  256.  
  257. TYPE
  258.   AttrActions = (
  259.     TCSANOW,
  260.       (* Terminalattribute werden sofort gesetzt. *)
  261.     TCSADRAIN,
  262.       (* Terminalattribute werden gesetzt, sobald alle gepufferten Ausgaben
  263.          geschrieben wurden. *)
  264.     TCSAFLUSH
  265.       (* Wie 'TCSADRAIN', aber entfernt alle Eingaben, die bis zum Setzen
  266.          der Attribute noch nicht gelesen wurden. *)
  267.   );
  268.  
  269. TYPE
  270.   FlowActions = (
  271.     TCOOFF,
  272.       (* Alle Ausgaben vom System anhalten. *)
  273.     TCOON,
  274.       (* Die Ausgaben vom System wieder einschalten. *)
  275.     TCIOFF,
  276.       (* System sendet ein 'STOP'-Zeichen, damit das Terminal keine Daten
  277.          mehr senden soll. *)
  278.     TCION
  279.       (* System sendet ein 'START'-Zeichen, damit das Terminal wieder senden
  280.          soll. *)
  281.   );
  282.  
  283. TYPE
  284.   QueueTypes = (
  285.     TCIFLUSH,
  286.       (* Alle noch nicht gelesenen Eingaben werden geloescht. *)
  287.     TCOFLUSH,
  288.       (* Alle noch nicht gesendeten Ausgaben werden geloescht. *)
  289.     TCIOFLUSH
  290.       (* 'TCIFLUSH' + 'TCOFLUSH' *)
  291.   );
  292.  
  293. (*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
  294.  
  295.  PROCEDURE isatty ((* EIN/ -- *) fd : INTEGER ): INTEGER;
  296.  
  297. (*--------------------------------------------------------------------------
  298.  | Liefert einen Wert groesser Null, falls <fd> das Handle eines (Pseudo)   |
  299.  | Terminals ist.                                                           |
  300.  |                                                                          |
  301.  | GEMDOS: Der Test wird mit "DosSupport.IsTerm()" durchgefuehrt.           |
  302.  |   MiNT: -""-                                                             |
  303.   --------------------------------------------------------------------------*)
  304.  
  305.  
  306.  PROCEDURE ttyname ((* EIN/ -- *) fd : INTEGER ): StrPtr;
  307.  
  308. (*--------------------------------------------------------------------------
  309.  | Falls <fd> ein Terminal repraesentiert, wird ein Zeiger auf den Pfadnamen|
  310.  | fuer dieses Terminal geliefert. Dieser Zeiger bleibt gueltig, bis erneut |
  311.  | "ttyname()" oder "ctermid()" aufgerufen wird. Falls <fd> kein Terminal   |
  312.  | repraesentiert, wird NULL zurueckgeliefert.                              |
  313.  |                                                                          |
  314.  | GEMDOS: <fd> = -2 liefert "/dev/aux", sonst "/dev/tty".                  |
  315.  |   MiNT: Keine Besonderheiten.                                            |
  316.   --------------------------------------------------------------------------*)
  317.  
  318.  PROCEDURE ctermid ((* EIN/ -- *) buf : StrPtr ): StrPtr;
  319.  
  320. (*--------------------------------------------------------------------------
  321.  | Die Funktion liefert den Pfadnamen des Kontrollterminals fuer diesen     |
  322.  | Prozess, unabhaengig davon, ob der Prozess gerade ein Kontrollterminal   |
  323.  | besitzt. Wenn <buf> NULL ist, wird ein Zeiger auf einen internen Puffer  |
  324.  | geliefert, der bis zum naechsten "ctermid()" oder "ttyname()" gueltig    |
  325.  | bleibt, sonst wird der Name nach <buf> kopiert, der auf ein Feld von     |
  326.  | mindestens 'LCtermid' Zeichen zeigen muss, und <buf> als Funktionswert   |
  327.  | geliefert.                                                               |
  328.  |                                                                          |
  329.  | GEMDOS: liefert "/dev/tty".                                              |
  330.  |   MiNT: Wenn ein Fehler auftritt, ist der Name "".                       |
  331.   --------------------------------------------------------------------------*)
  332.  
  333.  
  334.  
  335.  PROCEDURE cfgetispeed ((* EIN/ -- *) term : TermiosRec ): speedT;
  336.  
  337.  PROCEDURE cfsetispeed ((* EIN/ -- *) term  : TermiosRec;
  338.                         (* EIN/ -- *) speed : speedT     ): INTEGER;
  339.  
  340.  PROCEDURE cfgetospeed ((* EIN/ -- *) term : TermiosRec ): speedT;
  341.  
  342.  PROCEDURE cfsetospeed ((* EIN/ -- *) term  : TermiosRec;
  343.                         (* EIN/ -- *) speed : speedT     ): INTEGER;
  344.  
  345. (*--------------------------------------------------------------------------
  346.  | Dienen dem Ermitteln und Veraendern der Ein- und Ausgabegeschwindigkeit, |
  347.  | die in Variablen des Typs 'TermiosRec' kodiert ist. Die neuen Geschwin-  |
  348.  | digkeiten werden nur in den uebergebenen Variablen manipuliert, zum      |
  349.  | Setzen der Geschwindigkeiten ist "tcsetattr()" zu verwenden.             |
  350.  |                                                                          |
  351.  | "cfgetispeed()": Ermittelt die in <term> kodierte Eingabegeschwindigkeit.|
  352.  | "cfsetispeed()": Kodiert die Eingabegeschwindigkeit in <term>.           |
  353.  | "cfgetospeed()": Ermittelt die in <term> kodierte Ausgabegeschwindigkeit.|
  354.  | "cfsetospeed()": Kodiert Ausgabegeschwindigkeit in <term>.               |
  355.  |                                                                          |
  356.  | GEMDOS: Keine Besonderheiten.                                            |
  357.  |   MiNT: -""-                                                             |
  358.   --------------------------------------------------------------------------*)
  359.  
  360.  
  361.  
  362.  PROCEDURE tcgetattr ((* EIN/ -- *)     fd   : INTEGER;
  363.                       (* -- /AUS *) VAR term : TermiosRec ): INTEGER;
  364.  
  365.  PROCEDURE tcsetattr ((* EIN/ -- *) fd   : INTEGER;
  366.                       (* EIN/  - *) act  : AttrActions;
  367.                       (* EIN/AUS *) term : TermiosRec  ): INTEGER;
  368.  
  369. (*--------------------------------------------------------------------------
  370.  | "tcgetattr()" ermittelt die Terminalattribute, wenn <fd> die Kennung     |
  371.  | eines Terminals ist. Die entsprechenden Werte werden in <term> gesetzt.  |
  372.  |                                                                          |
  373.  | "tcsetattr()" setzt die Terminalattribute, wenn <fd> die Kennung eines   |
  374.  | Terminals ist, auf die Werte in <term>. <act> gibt an, zu welchem Zeit-  |
  375.  | punkt die neuen Werte gesetzt werden (siehe 'AttrActions'). Wenn die     |
  376.  | Attribute des Kontrollterminals gesetzt werden sollen, darf der Prozess  |
  377.  | kein Hintergrundprozess sein.                                            |
  378.  | Die Funktion meldet Erfolg, solange mindestens eins der neuen Attribute  |
  379.  | gesetzt werden konnte; es wird erst ein Fehler gemeldet, wenn kein       |
  380.  | einziges Attribut gesetzt werden konnte!                                 |
  381.  |                                                                          |
  382.  | GEMDOS: (noch) nicht implementiert                                       |
  383.  |   MiNT: -""-                                                             |
  384.   --------------------------------------------------------------------------*)
  385.  
  386.  
  387.  
  388.  
  389.  PROCEDURE tcsendbreak ((* EIN/ -- *) fd       : INTEGER;
  390.                         (* EIN/ -- *) duration : INTEGER ): INTEGER;
  391.  
  392.  PROCEDURE tcdrain ((* EIN/ -- *) fd : INTEGER ): INTEGER;
  393.  
  394.  PROCEDURE tcflow ((* EIN/ -- *) fd     : INTEGER;
  395.                    (* EIN/ -- *) action : FlowActions ): INTEGER;
  396.  
  397.  PROCEDURE tcflush ((* EIN/ -- *) fd   : INTEGER;
  398.                     (* EIN/ -- *) qsel : QueueTypes ): INTEGER;
  399.  
  400. (*--------------------------------------------------------------------------
  401.  | Fuer die folgenden Funktionen gilt: Wenn die Attribute des Kontrollter-  |
  402.  | minals gesetzt werden sollen, darf der Prozess kein Hintergrundprozess   |
  403.  | sein.                                                                    |
  404.  |                                                                          |
  405.  | "tcsendbreak()": Wenn <fd> die Kennung einer asynchronen (seriellen)     |
  406.  |                  Schnittstelle ist, wird eine ``Break condition'', d.h.  |
  407.  |                  eine Folge von Nullbits, gesendet. Falls <duration> = 0,|
  408.  |                  dauert die Uebetragung mindestens eine Viertelsekunde;  |
  409.  |                  andere Werte fuehren zu einer systemspezifischen Dauer. |
  410.  |                                                                          |
  411.  | "tcdrain()"    : Der aufrufende Prozess wird solange blockiert, bis alle |
  412.  |                  Ausgaben auf <fd> gesendet wurden.                      |
  413.  |                                                                          |
  414.  | "tcflow()"     : Kontrolliert die Ein- und Ausgabe gemaess <action>      |
  415.  |                  (siehe 'FlowActions').                                  |
  416.  |                                                                          |
  417.  | "tcflush()"    : Loescht gepufferte, aber noch nicht gelesene bzw. gesen-|
  418.  |                  dete Ein- und Ausgaben; welche Daten geloescht werden,  |
  419.  |                  wird ueber <qsel> bestimmt (siehe 'QueueTypes').        |
  420.  |                                                                          |
  421.  | GEMDOS: (noch) nicht implementiert                                       |
  422.  |   MiNT: -""-                                                             |
  423.   --------------------------------------------------------------------------*)
  424.  
  425.  
  426.  
  427.  PROCEDURE tcgetpgrp ((* EIN/ -- *) fd : INTEGER ): pidT;
  428.  
  429.  PROCEDURE tcsetpgrp ((* EIN/ -- *) fd   : INTEGER;
  430.                       (* EIN/ -- *) pgrp : pidT    ): INTEGER;
  431.  
  432. (*--------------------------------------------------------------------------
  433.  | "tcgetpgrp()": Ermittelt die Prozessgruppenkennung der Vordergrundpro-   |
  434.  |                zessgruppe des Kontrollterminals.                         |
  435.  | "tcsetpgrp()": Setzt die Kennung der Vordergrundprozessgruppe fuer das   |
  436.  |                Kontrollterminal auf <pgrp>.                              |
  437.  |                                                                          |
  438.  | GEMDOS: Liefert immer -1 ('errno' = 'ENOSYS').                           |
  439.  |   MiNT: Keine Besonderheiten.                                            |
  440.   --------------------------------------------------------------------------*)
  441.  
  442. END term.
  443.